package com.tutorial;

import com.tutorial.advice.MyAdvice3;
import com.tutorial.cglib.Target;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

/**
 * Cglib方式生成代理
 * className: CglibTutorial
 * author: GXW
 * date: 2025/7/28 13:30:20
 * description: TODO Cglib方式生成代理
 */
public class CglibTutorial {
	public static void main(String[] args) {
		// 	Cglib基于父类（目标类）生成Proxy
		// 目标对象
		Target target = new Target();
		// 	通知对象（增强对象）
		MyAdvice3 myAdvice3 = new MyAdvice3();

		// 	编写cglib代码
		Enhancer enhancer = new Enhancer();
		// 	设置父类
		// 生成的代理对象就是Target的子类
		enhancer.setSuperclass(Target.class);
		// interceptor方法相当于JDK的Proxy的invoke方法
		enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> {
			myAdvice3.before();
			Object res = method.invoke(target, objects);
			myAdvice3.after();
			return res;
		});
		// 	生成代理对象
		Target proxy = (Target) enhancer.create();

		// 	测试
		proxy.show();
	}
}
